<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta content="minimum-scale=1, initial-scale=1, maximum-scale=1, width=device-width, shrink-to-fit=no" name="viewport">
  <link rel="stylesheet" href="/static/css/tabler-icons.min.css">
  <link href="/static/css/style.css" rel="stylesheet" type="text/css">
  <link href="/static/img/logo.png" rel="shortcut icon" type="image/png">
  <link href="/static/img/logo.png" rel="shortcut icon" sizes="192x192">
  <link href="/static/img/logo.png" rel="apple-touch-icon">
  <meta content="Logseq" name="apple-mobile-web-app-title">
  <meta content="yes" name="apple-mobile-web-app-capable">
  <meta content="yes" name="apple-touch-fullscreen">
  <meta content="black-translucent" name="apple-mobile-web-app-status-bar-style">
  <meta content="yes" name="mobile-web-app-capable">
  <meta content="summary" name="twitter:card">
  <meta content="A privacy-first, open-source platform for knowledge management and collaboration." name="twitter:description">
  <meta content="@logseq" name="twitter:site">
  <meta content="A privacy-first, open-source platform for knowledge management and collaboration." name="twitter:title">
  <meta content="https://asset.logseq.com/static/img/logo.png" name="twitter:image:src">
  <meta content="A privacy-first, open-source platform for knowledge management and collaboration." name="twitter:image:alt">
  <meta content="A privacy-first, open-source platform for knowledge management and collaboration." property="og:title">
  <meta content="site" property="og:type">
  <meta content="https://logseq.com" property="og:url">
  <meta content="https://asset.logseq.com/static/img/logo.png" property="og:image">
  <meta content="A privacy-first, open-source platform for knowledge management and collaboration." property="og:description">
  <title>Logseq: "A privacy-first platform for knowledge management and collaboration."</title>
  <meta content="logseq" property="og:site_name">
  <meta content="A privacy-first, open-source platform for knowledge management and collaboration." name="description">
</head>
<body>
<div id="root"></div>
<script>window.user = null</script>
<script>window.__LSP__HOST__ = true</script>
<script src="/static/js/magic_portal.js"></script>
<script>let worker = new Worker('/static/js/worker.js')
const portal = new MagicPortal(worker);
(async () => {
  const git = await portal.get('git')
  window.git = git
  const fs = await portal.get('fs')
  window.fs = fs
  const pfs = await portal.get('pfs')
  window.pfs = pfs
  const gitHttp = await portal.get('gitHttp')
  window.gitHttp = gitHttp
  const workerThread = await portal.get('workerThread')
  window.workerThread = workerThread
})()
</script>
<script defer src="/static/js/highlight.min.js"></script>
<script defer src="/static/js/interact.min.js"></script>
<script defer src="/static/js/lsplugin.core.js"></script>
<script defer src="/static/js/main.js"></script>
<script defer src="/static/js/code-editor.js"></script>
<script defer src="/static/js/age-encryption.js"></script>
<script defer src="/static/js/excalidraw.js"></script>
<script>
  /*!
 * swiped-events.js - v1.1.6
 * Pure JavaScript swipe events
 * https://github.com/john-doherty/swiped-events
 * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element
 * @author John Doherty <www.johndoherty.info>
 * @license MIT
 */
!function(t,e){"use strict";"function"!=typeof t.CustomEvent&&(t.CustomEvent=function(t,n){n=n||{bubbles:!1,cancelable:!1,detail:void 0};var a=e.createEvent("CustomEvent");return a.initCustomEvent(t,n.bubbles,n.cancelable,n.detail),a},t.CustomEvent.prototype=t.Event.prototype),e.addEventListener("touchstart",function(t){if("true"===t.target.getAttribute("data-swipe-ignore"))return;s=t.target,r=Date.now(),n=t.touches[0].clientX,a=t.touches[0].clientY,u=0,i=0},!1),e.addEventListener("touchmove",function(t){if(!n||!a)return;var e=t.touches[0].clientX,r=t.touches[0].clientY;u=n-e,i=a-r},!1),e.addEventListener("touchend",function(t){if(s!==t.target)return;var e=parseInt(l(s,"data-swipe-threshold","20"),10),o=parseInt(l(s,"data-swipe-timeout","500"),10),c=Date.now()-r,d="",p=t.changedTouches||t.touches||[];Math.abs(u)>Math.abs(i)?Math.abs(u)>e&&c<o&&(d=u>0?"swiped-left":"swiped-right"):Math.abs(i)>e&&c<o&&(d=i>0?"swiped-up":"swiped-down");if(""!==d){var b={dir:d.replace(/swiped-/,""),touchType:(p[0]||{}).touchType||"direct",xStart:parseInt(n,10),xEnd:parseInt((p[0]||{}).clientX||-1,10),yStart:parseInt(a,10),yEnd:parseInt((p[0]||{}).clientY||-1,10)};s.dispatchEvent(new CustomEvent("swiped",{bubbles:!0,cancelable:!0,detail:b})),s.dispatchEvent(new CustomEvent(d,{bubbles:!0,cancelable:!0,detail:b}))}n=null,a=null,r=null},!1);var n=null,a=null,u=null,i=null,r=null,s=null;function l(t,n,a){for(;t&&t!==e.documentElement;){var u=t.getAttribute(n);if(u)return u;t=t.parentNode}return a}}(window,document);
</script>
</body>
</html>
